using ZYFramework.AudioSystem;
using Cysharp.Threading.Tasks;
using UnityActionSystem;
using UnityEngine;

namespace ZYFramework.AudioSystem.Samples
{
    /// <summary>
    /// 音频系统事件触发方式样例
    /// 演示如何使用事件系统解耦调用音频播放
    /// </summary>
    public class AudioSystemEventExample : MonoBehaviour
    {
        [Header("测试音频名称")]
        [SerializeField] private string test2DAudioName = "BulletFire";
        [SerializeField] private string test3DAudioName = "Footstep";
        [SerializeField] private string testBGMName = "GameMain";

        private EventBusEntity _eventBus;

        private void Start()
        {
            // 订阅音频事件（可选，用于监听播放结果）
            SubscribeAudioEvents();

            Debug.Log("[事件示例] 事件订阅完成，可以通过发布事件来触发音频播放");
        }

        /// <summary>
        /// 订阅音频事件（监听播放结果）
        /// </summary>
        private void SubscribeAudioEvents()
        {
            try
            {
                // 注意：这里需要获取EventBusEntity实例
                // 实际项目中应该通过单例或其他方式获取
                _eventBus = GetEventBusEntity();

                if (_eventBus != null)
                {
                    Debug.Log("[事件示例] EventBusEntity已找到，订阅事件");
                }
                else
                {
                    Debug.LogWarning("[事件示例] EventBusEntity未找到，事件触发方式可能不可用");
                }
            }
            catch (System.Exception e)
            {
                Debug.LogWarning($"[事件示例] 订阅事件失败: {e.Message}");
            }
        }

        /// <summary>
        /// 获取EventBusEntity实例
        /// </summary>
        private EventBusEntity GetEventBusEntity()
        {
            // 尝试通过反射获取（实际项目中应该有更好的方式）
            try
            {
                var eventBusType = typeof(EventBusEntity);
                var instanceField = eventBusType.GetField("_instance",
                    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
                if (instanceField != null)
                {
                    return instanceField.GetValue(null) as EventBusEntity;
                }
            }
            catch
            {
                // 反射失败
            }

            return null;
        }

        private void Update()
        {
            // 键盘测试
            if (Input.GetKeyDown(KeyCode.Alpha1))
            {
                TestPlay2DEvent();
            }

            if (Input.GetKeyDown(KeyCode.Alpha2))
            {
                TestPlay3DEvent();
            }

            if (Input.GetKeyDown(KeyCode.Alpha3))
            {
                TestPlayBGMEvent();
            }

            if (Input.GetKeyDown(KeyCode.Alpha4))
            {
                TestStopAudioEvent();
            }
        }

        /// <summary>
        /// 测试通过事件发布播放2D音效
        /// </summary>
        [ContextMenu("测试事件播放2D音效")]
        public void TestPlay2DEvent()
        {
            if (_eventBus == null)
            {
                Debug.LogError("[事件示例] EventBusEntity未初始化");
                return;
            }

            var eventData = new PlaySFXEventData(test2DAudioName);
            _eventBus.Publish(AudioEventIds.PlaySFX, eventData, EventPriority.Normal);
            Debug.Log($"[事件示例] 发布播放2D音效事件: {test2DAudioName}");
        }

        /// <summary>
        /// 测试通过事件发布播放3D音效
        /// </summary>
        [ContextMenu("测试事件播放3D音效")]
        public void TestPlay3DEvent()
        {
            if (_eventBus == null)
            {
                Debug.LogError("[事件示例] EventBusEntity未初始化");
                return;
            }

            var eventData = new Play3DSFXEventData(test3DAudioName, transform);
            _eventBus.Publish(AudioEventIds.Play3DSFX, eventData, EventPriority.Normal);
            Debug.Log($"[事件示例] 发布播放3D音效事件: {test3DAudioName}");
        }

        /// <summary>
        /// 测试通过事件发布播放BGM
        /// </summary>
        [ContextMenu("测试事件播放BGM")]
        public void TestPlayBGMEvent()
        {
            if (_eventBus == null)
            {
                Debug.LogError("[事件示例] EventBusEntity未初始化");
                return;
            }

            var eventData = new PlayBGMEventData(testBGMName);
            _eventBus.Publish(AudioEventIds.PlayBGM, eventData, EventPriority.High);
            Debug.Log($"[事件示例] 发布播放BGM事件: {testBGMName}");
        }

        /// <summary>
        /// 测试通过事件停止音效
        /// </summary>
        [ContextMenu("测试事件停止音效")]
        public void TestStopAudioEvent()
        {
            if (_eventBus == null)
            {
                Debug.LogError("[事件示例] EventBusEntity未初始化");
                return;
            }

            var eventData = new StopAllAudioEventData();
            _eventBus.Publish(AudioEventIds.StopAllAudio, eventData, EventPriority.Normal);
            Debug.Log("[事件示例] 发布停止所有音效事件");
        }

        private void OnGUI()
        {
            GUILayout.BeginArea(new Rect(10, 10, 350, 250));
            GUILayout.Label("=== 音频系统事件示例 ===");
            GUILayout.Label("按 1 - 事件播放2D音效");
            GUILayout.Label("按 2 - 事件播放3D音效");
            GUILayout.Label("按 3 - 事件播放BGM");
            GUILayout.Label("按 4 - 事件停止所有音效");
            GUILayout.Space(10);

            if (_eventBus == null)
            {
                GUILayout.Label("⚠️ EventBusEntity未初始化", GUI.skin.box);
            }
            else
            {
                GUILayout.Label("✅ EventBusEntity已就绪", GUI.skin.box);
            }

            GUILayout.EndArea();
        }
    }
}
